<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from deftbl.tnf on 19 December 2010 -->

<TITLE>Definition Table - The Definition Table Interface</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Definition Table</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="deftbl_2.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="deftbl_4.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="deftbl_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC10" HREF="deftbl_toc.html#SEC10">The Definition Table Interface</A></H1>
<P>
The interface to the definition table module has two parts, one fixed and
the other dependent on a specification supplied by the user.
The fixed part of the interface exports the value <CODE>NoKey</CODE> and the
<A NAME="IDX30"></A>
operation <CODE>NewKey</CODE>
<A NAME="IDX31"></A>
(see  <A HREF="deftbl_1.html#SEC2">How to create and use definition table keys</A>).
The variable part of the interface exports the query and update operations
<A NAME="IDX32"></A>
for the properties specified by the user.
<P>
A library of predefined query and update operations is provided to
implement common tasks; users can also provide their own operations.
The set of operations and properties for a specific processor is defined by
a specification written in a special-purpose language.
<P>
PDL generates definitions for each of the operations specified in files
of type <TT>`.pdl'</TT>.  These definitions are made available in the
<A NAME="IDX33"></A>
generated file <TT>`pdl_gen.h'</TT>.  Although this file is automatically
included for use in your attribute grammar specifications, any C files
which use definition table operations must include this file.
<P>
<H2><A NAME="SEC11" HREF="deftbl_toc.html#SEC11">Predefined query and update operations</A></H2>
<P>
The basic query and update operations for the <CODE>Name</CODE> property
are <CODE>GetName</CODE>
(see  <A HREF="deftbl_1.html#SEC4">Behavior of the basic query operations</A>),
<CODE>SetName</CODE>, and <CODE>ResetName</CODE>
(see  <A HREF="deftbl_1.html#SEC5">Behavior of the basic update operations</A>).
These operations are sufficient in most cases, and are provided
automatically for every property.
Other operations, such as <CODE>IsName</CODE> and <CODE>UniqueName</CODE> are available, 
but must be explicitly requested as
discussed in the next section.
<P>
<P>
<PRE>
void IsName(DefTableKey key, Type which, Type error)
<A NAME="IDX34"></A>
<A NAME="IDX35"></A>
</PRE>
<P>
If <CODE>IsName</CODE> is applied to a definition table key that has no
associated <CODE>Name</CODE> property,
then a <CODE>Name</CODE> property with the value of parameter <CODE>which</CODE>
becomes associated with that definition table key as a result of the
operation.
If it is applied to a definition table key that does have an associated
<CODE>Name</CODE> property, and the current value of that property is not equal to
the value of the parameter <CODE>which</CODE>, then the value of that property is
changed to the value of the parameter <CODE>error</CODE>.
Otherwise the operation has no effect.
<P>
Since <CODE>NoKey</CODE> represents an invalid entity that has no properties,
applying <CODE>IsName</CODE> to <CODE>NoKey</CODE> has no effect.
<P>
<P>
<PRE>
void UniqueName(DefTableKey key, Type next())
<A NAME="IDX36"></A>
</PRE>
<P>
If <CODE>UniqueName</CODE> is applied to a definition table key that has no
associated <CODE>Name</CODE> property,
then a <CODE>Name</CODE> property with the value returned by the invocation of
parameter <CODE>next</CODE> becomes associated with that definition table key as a
result of the operation.
Otherwise the operation has no effect.
<P>
Since <CODE>NoKey</CODE> represents an invalid entity that has no properties,
applying <CODE>UniqueName</CODE> to <CODE>NoKey</CODE> has no effect.
<P>
Parameter <CODE>next</CODE> is invoked if and only if <CODE>UniqueName</CODE> is
applied to a definition table key that differs from <CODE>NoKey</CODE> and has
no associated <CODE>Name</CODE> property.
<P>
<P>
<PRE>
int HasName(DefTableKey key)
<A NAME="IDX37"></A>
</PRE>
<P>
If <CODE>Has</CODE> is applied to a definition table key that has an
associated <CODE>Name</CODE> property, then it yields 1; otherwise it yields 0.
<P>
Since <CODE>NoKey</CODE> represents an invalid entity that has no properties,
applying <CODE>Has</CODE> to <CODE>NoKey</CODE> yields 0.
<P>
<H2><A NAME="SEC12" HREF="deftbl_toc.html#SEC12">The property definition language</A></H2>
<P>
The property definition language allows a user to specify an arbitrary set
<A NAME="IDX38"></A>
of properties of arbitrary types, to assert that certain operations from
the library should be available to query or update these properties, and to
define new operations.
It also allows a user to establish the initial state of the definition table.
Specifications in the property definition language are distinguished by
<A NAME="IDX39"></A>
being provided in files of type <CODE>pdl</CODE>.
<A NAME="IDX40"></A>
<P>
An arbitrary number of such files may be provided; they will be
concatenated to form the complete specification of the variable part of the
definition table module's interface.
Each file consists of a set of property and operation declarations
as are described in the following sections.
Because the files are concatenated, specifications in one need not be
repeated in another.
Nevertheless, we strongly suggest that each file contain a
complete specification for one or more tasks.
This allows maximum reuse of existing text.
<P>
C pre-processor directives and C comments can be used in type-<CODE>pdl</CODE>
<A NAME="IDX42"></A>
<A NAME="IDX41"></A>
files.
<P>
<H3><A NAME="SEC13" HREF="deftbl_toc.html#SEC13">How to declare properties</A></H3>
<P>
Properties are declared by specifying the property name and type,
optionally with a set of operations that should apply to properties of the
type specified.
If the type is defined by a typedef, and is not equal to
<CODE>DefTableKey</CODE>,
the file containing the typedef must be specified.
<P>
The general form of a property declaration is given by:
<A NAME="IDX43"></A>
<P>
<PRE>
PropertySpec: FileName / PropertyDecl .
FileName: String .
PropertyDecl: PropertyNameList ':' Type ';' .
PropertyNameList: Identifier / PropertyNameList ',' Identifier .
Type: Identifier / Identifier '[' OperationList ']' .
OperationList: Identifier / OperationList ',' Identifier .
</PRE>
<P>
Both <CODE>String</CODE> and <CODE>Identifier</CODE> are constructed according to the
rules of C.
The <CODE>FileName</CODE> string must be a valid file name.
Each <CODE>Identifier</CODE> appearing in a <CODE>PropertyNameList</CODE> is a defining
occurrence; all other occurrences of <CODE>Identifier</CODE> are applied.
Multiple defining occurrences for property names are allowed, provided that
they all define the property to hold values of the same type.
<A NAME="IDX44"></A>
<P>
Operation names are formed by concatenating an <CODE>Identifier</CODE> appearing
<A NAME="IDX45"></A>
in an <CODE>OperationList</CODE> with an <CODE>Identifier</CODE> appearing in a
<CODE>PropertyNameList</CODE>.
<CODE>Reset</CODE>, <CODE>Get</CODE> and <CODE>Set</CODE> are automatically defined
for every property, and need not appear in any <CODE>OperationList</CODE>.
<P>
Here are some valid property definitions:
<A NAME="IDX46"></A>
<P>
<PRE>
Def, Kind: int;
Type: DefTableKey [Is];
Storage: StorageRequired; "Storage.h"
</PRE>
<P>
<CODE>Def</CODE> and <CODE>Kind</CODE> are integer-valued properties.
The variable part of the definition table interface will export operations
<CODE>GetDef</CODE>, <CODE>SetDef</CODE>, <CODE>ResetDef</CODE>, 
<CODE>GetKind</CODE>, <CODE>SetKind</CODE>, and <CODE>ResetKind</CODE>.
It will also export <CODE>GetType</CODE>, <CODE>SetType</CODE>, <CODE>ResetType</CODE>,
and <CODE>IsType</CODE>
because the library operation <CODE>Is</CODE> appears in the <CODE>OperationList</CODE>
on the second line.
Note that this specification will produce <CODE>GetStorage</CODE>, 
<CODE>SetStorage</CODE>, and <CODE>ResetStorage</CODE>, but will not produce 
<CODE>IsStorage</CODE>, because <CODE>Is</CODE> does not appear in any
<CODE>OperationList</CODE> for the property <CODE>Storage</CODE>.
If <CODE>Is</CODE> did appear in an <CODE>OperationList</CODE> for the property
<CODE>Storage</CODE> anywhere in the specification, even in another
type-<CODE>pdl</CODE> file, then the generated module would export
<CODE>IsStorage</CODE>.
<P>
Type <CODE>int</CODE> is a primitive type of C, and <CODE>DefTableKey</CODE> is defined
by the definition table module itself.
Thus neither of these types needs to be defined specially.
<CODE>StorageRequired</CODE> must be defined, however, and therefore file
<TT>`storage.h'</TT> is named explicitly
(see  <A HREF="lib_1.html#SEC10">Storage Allocation Module of Library Reference Manual</A>).
This file name could be placed anywhere in the specification, even in
another type-<CODE>pdl</CODE> file.  The order in which such header files are
named within any given <CODE>pdl</CODE> file is maintained in the generated
modules.
<P>
<H3><A NAME="SEC14" HREF="deftbl_toc.html#SEC14">How to declare operations</A></H3>
<P>
Operations can be declared by specifying a name, a prototype and a body.
The operations are generic, with the operand and result types depending on
the type of the property for which the generic operation is associated
(see  <A HREF="deftbl_3.html#SEC13">How to declare properties</A>).
If an operation is declared to have the same name as one present in the
library, the user-defined operation will take precedence.
<P>
The general form of an operation declaration is given by:
<A NAME="IDX47"></A>
<P>
<PRE>
OperationDecl: Gtype Identifier '(' Parameters ')' Text .
Gtype: 'TYPE' / Ctype .
Parameters: Parameter / Parameters ',' Parameter .
Parameter: Gtype Identifier .
</PRE>
<P>
<CODE>TYPE</CODE> is used to represent the type of the property with which the
operation is associated, while <CODE>Ctype</CODE> stands for any valid C type
declarator.
One of the parameters (by convention the first) must be of type
<CODE>DefTableKey</CODE>, and must have the name <CODE>key</CODE>; the other parameters
are arbitrary.
<P>
<CODE>Text</CODE> is any C compound statement, enclosed in <CODE>{}</CODE>.
Within this compound statement, certain macros may be used:
<A NAME="IDX48"></A>
<P>
<DL COMPACT>
<A NAME="IDX49"></A>
<DT><CODE>PRESENT</CODE>
<DD>Returns true if the property has an associated value and false if it
does not.
<A NAME="IDX50"></A>
<DT><CODE>ACCESS</CODE>
<DD>The return value is the same as that of PRESENT, but ACCESS guarantees
that space has been allocated for the property after invocation.
<A NAME="IDX51"></A>
<DT><CODE>VALUE</CODE>
<DD>Current value of the property.
</DL>
<P>
The <CODE>VALUE</CODE> macro can be used either as the source of an existing
value or the destination for a new value.
It is defined after an invocation of the <CODE>ACCESS</CODE> macro, or whenever
the <CODE>PRESENT</CODE> macro returns true.
<P>
<P>
Here is the declaration of the basic query operation from the library:
<A NAME="IDX52"></A>
<P>
<PRE>
TYPE Get(DefTableKey key, TYPE deflt)
<A NAME="IDX53"></A>{ if (key == NoKey) return deflt;
  if (PRESENT) return VALUE;
  else return deflt;
}
</PRE>
<P>
The type of the value returned by a <CODE>Get</CODE> operation is the type of the
associated property (<CODE>TYPE</CODE>), which is also the type of the
<CODE>deflt</CODE> parameter.
<CODE>PRESENT</CODE> is used to check whether a value is associated with the
property, and if so that value (<CODE>VALUE</CODE>) is returned.
<P>
<P>
Here is the declaration of the <CODE>Set</CODE> operation from the library:
<P>
<PRE>
void Set(DefTableKey key, TYPE add, TYPE replace)
<A NAME="IDX54"></A>{ if (key == NoKey) return;
  if (ACCESS) VALUE = replace;
  else VALUE = add;
}
</PRE>
<P>
No value is returned by a <CODE>Set</CODE> operation.
<CODE>ACCESS</CODE> is used to check whether a value is associated with the
property, and also to guarantee that space for a value is available.
The available space is then filled appropriately.
<P>
<P>
Here is the declaration of the <CODE>Reset</CODE> operation from the library:
<P>
<PRE>
void Reset(DefTableKey key, TYPE val)
<A NAME="IDX55"></A>{ if (key == NoKey) return;
  ACCESS; VALUE = val;
}
</PRE>
<P>
No value is returned by a <CODE>Reset</CODE> operation.
<CODE>ACCESS</CODE> is used to ensure that space is made available to hold
the value of the property.  The value is then set to <CODE>val</CODE>.
<P>
<P>
Here is the declaration of the conditional update operation from the library:
<P>
<PRE>
void Is(DefTableKey key, TYPE which, TYPE error)
<A NAME="IDX56"></A>{ if (key == NoKey) return;
  if (!ACCESS) VALUE = which;
  else if (VALUE != which) VALUE = error;
}
</PRE>
<P>
<P>
Here is the library operation that guarantees a unique value for a
property:
<P>
<PRE>
void Unique(DefTableKey key, TYPE next())
<A NAME="IDX57"></A>{ if (key == NoKey) return;
  if (!ACCESS) VALUE = next();
}
</PRE>
<P>
The <CODE>next</CODE> parameter is a function that delivers a new value of the
type of the associated property each time it is called.
It will be invoked only when there is currently no value associated with
the property.
<P>
<H3><A NAME="SEC15" HREF="deftbl_toc.html#SEC15">How to specify the initial state</A></H3>
<P>
The initial state of the definition table consists of a set of
<DFN>known keys</DFN>,
<A NAME="IDX58"></A>
some of which may have associated property values.
Each known key is represented by an identifier, which can be used anywhere
that a value of type <CODE>DefTableKey</CODE> is required.
<P>
The general form of a known key specification is given by:
<A NAME="IDX59"></A>
<P>
<PRE>
KnownKey: Identifier PropertyValueList ';' .
PropertyValueList: / '-&#62;' PropertyValues .
PropertyValues: PropertyValue // ',' .
PropertyValue: Identifier '=' Text .
</PRE>
<P>
<CODE>Text</CODE> is any C initializer valid for the type of the property, enclosed
in <CODE>{}</CODE>.
It may contain constant identifiers, including identifiers that represent
known keys, regardless of where they are declared.
Each <CODE>Identifier</CODE> appearing in a <CODE>PropertyValue</CODE> must be declared
elsewhere in the PDL specification (i.e. in some type-<CODE>pdl</CODE> file,
see  <A HREF="deftbl_3.html#SEC12">The property definition language</A>).
<P>
Here are some valid specifications of known keys:
<P>
<PRE>
ErrorType;
IntegerKey -&#62; Def={1}, Type={IntegerType};
IntegerType -&#62; Storage = {4,4,0};
</PRE>
<P>
The known key <CODE>ErrorType</CODE> has no properties initially, while the known
key <CODE>IntegerKey</CODE> has two and the known key <CODE>IntegerType</CODE> has one.
All of these properties were declared above
(see  <A HREF="deftbl_3.html#SEC12">The property definition language</A>).
<CODE>IntegerType</CODE> is a value of type <CODE>DefTableKey</CODE>, and is therefore
a valid initializer for the <CODE>Type</CODE> property of <CODE>IntegerKey</CODE>.
To see that the initializer given for the <CODE>Storage</CODE> property of
<CODE>IntegerType</CODE> is valid, one would need to consult the file
<TT>`storage.h'</TT>.
That file is the interface specification for the data mapping module, and
its name appeared in the declaration of the <CODE>Storage</CODE> property.
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="deftbl_2.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="deftbl_4.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="deftbl_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
